import axios from "axios";

import store from "../store";
import JSONbig from "json-bigint";
import {Toast} from 'vant'
import router from '../router'

// 单独发请求
const refreshTokenReq = axios.create({
    baseURL:'http://toutiao.itheima.net'
})

const request = axios.create({
  baseURL: "http://toutiao.itheima.net",
  transformResponse: [
    function(data) {
      try {
        return JSONbig.parse(data);
      } catch (err) {
        console.log("转换失败", err);
        return data;
      }
    }
  ]
});

// 请求拦截器：在请求之前可以检测到的将要做的一些事情

request.interceptors.request.use(config => {
  const { user } = store.state;
  if (user) {
    config.headers.Authorization = `Bearer ${user.token}`;
  }
  return config;
});

// 响应拦截器
request.interceptors.response.use(
  config => {
    // 成功的回调函数：服务器响应数据回来以后可以检测到，可以做一些事情
    return config;
  },
  async error => {
    const status = error.response.status;
    if (status === 400) {
        Toast.fail('客户端请求参数异常')
    } else if (status === 401) {
        //没有user 直接去登录
        // 请求获取token再发出
        if(!user||!user.token){
            // 直接跳转到登录页
            return redirectLogin()
        }
        // 使用refresh_token 请求获取新的 token
        try{
            const {data} = await refreshTokenReq({
                method:'PUT',
                url:'/v1_0/authorizations',
                header:{
                    Authorization:`Bearer${user.refresh_token}`
                } 
            })
            // 刷新用户token成功
            user.token = data.data.token
            store.commit('setUser',user)
            // 把失败的请求发出去
            // error.config 是本次请求的相关配置信息对象
            // 它的请求拦截器中通过store容器访问token数据
            return request(error.config)
        }catch(err){
            redirectLogin()
        }
    } else if (status === 403) {
    } else if (status >= 500) {
        Toast.fail('服务端异常')
    }
    return Promise.reject(error);
  }
);

// 解决页面回退的方式
function redirectLogin(){
    router.replace({
        name:'login',
        // 查询参数以问号的方式放到url后面
        // router.currentRoute 与this.$router是一个东西
        query:{
            redirect:router.currentRoute.fullPath
        }
    })
}
export default request;
